package com.example.Servlet;

import com.example.Service.UserService;
import com.example.pojo.PasswordResetVo;
import com.google.gson.Gson;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

@WebServlet(name = "PasswordResetServlet", value = "/PasswordResetServlet")
public class PasswordResetServlet extends HttpServlet {
    private String message;

    public void init() {
        message = "FJ";
    }

    @Override
    protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:5501"); // 前端地址
        resp.setHeader("Access-Control-Allow-Methods", "POST"); // 允许POST请求
        resp.setHeader("Access-Control-Allow-Headers", "Content-Type"); // 允许JSON格式
        resp.setHeader("Access-Control-Allow-Credentials", "true"); // 允许携带凭证
        resp.setStatus(HttpServletResponse.SC_OK); // 返回200状态码
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 设置响应格式：JSON+UTF-8（防止中文乱码）
        resp.setContentType("application/json;charset=UTF-8");
        // 跨域配置（和doOptions保持一致）
        resp.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:5500");
        resp.setHeader("Access-Control-Allow-Credentials", "true");

        // 2. 读取前端传来的JSON数据（账号、手机号、验证码、新密码）
        BufferedReader br = req.getReader();
        StringBuffer sb = new StringBuffer();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line); // 拼接JSON字符串
        }
        String jsonStr = sb.toString();
        System.out.println("找回密码请求参数：" + jsonStr); // 日志：打印请求参数

        // 3. 将JSON解析为PasswordResetVO对象（用Gson）
        Gson gson = new Gson();
        PasswordResetVo resetVO = gson.fromJson(jsonStr,PasswordResetVo.class);

        // 4. 验证验证码（从ServletContext中获取后端生成的验证码）
        ServletContext application = req.getServletContext();
        String systemCheckNum = (String) application.getAttribute("checkNum"); // 后端生成的验证码
        Map<String, Object> resultMap = new HashMap<>(); // 响应结果（给前端）

        // 4.1 校验验证码是否过期（后端没生成或已被覆盖）
        if (systemCheckNum == null) {
            resultMap.put("code", 500);
            resultMap.put("msg", "验证码已过期，请刷新重试");
        }
        // 4.2 校验验证码是否正确（忽略大小写，提升体验）
        else if (!systemCheckNum.equalsIgnoreCase(resetVO.getCheckNum().trim())) {
            resultMap.put("code", 500);
            resultMap.put("msg", "验证码错误");
        }
        // 4.3 验证码通过，执行找回密码业务逻辑
        else {
            try {
                UserService userService = new UserService();
                String msg = userService.resetPassword(resetVO); // 调用业务方法
                // 根据业务返回的信息，设置响应码（200=成功，500=失败）
                resultMap.put("code", msg.contains("成功") ? 200 : 500);
                resultMap.put("msg", msg);
            } catch (RuntimeException e) {
                // 捕获异常（如数据库错误）
                resultMap.put("code", 500);
                resultMap.put("msg", "服务器错误：" + e.getMessage());
                e.printStackTrace(); // 打印异常日志，方便排查
            }
        }

        // 5. 将响应结果（Map）转为JSON，返回给前端
        String resultJson = gson.toJson(resultMap);
        System.out.println("找回密码响应结果：" + resultJson); // 日志：打印响应结果
        resp.getWriter().write(resultJson); // 输出到前端
    }
    }


